package pe.com.hermes.hermetic.web.controller.general;

import pe.com.hermes.hermetic.beans.CuentaBean;
import pe.com.hermes.hermetic.negocio.service.HermeticFacade;

import pe.com.hermes.hermetic.negocio.ultil.Util;
import pe.com.hermes.hermetic.web.controller.base.IController;
import pe.com.hermes.hermetic.web.forms.SelecUnidMoneForm;

import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;

import org.apache.log4j.Logger;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.SessionAttributes;

@Controller
@RequestMapping("/selecUnidMoneMultiSucu.html")
@SessionAttributes(value={"listModulos"})
public class SeleccionarUnidMoneMultiSucuController implements IController{
    protected final static Logger logger = Logger.getLogger(SeleccionarUnidMoneController.class);
    @Autowired
    private HermeticFacade servicioHermetic;
    @RequestMapping(method={RequestMethod.GET})    
    protected String showForm(ModelMap model,HttpServletRequest request)throws Exception{
        try {
            logger.info(this.getClass().toString()+" "+"metodo: GET");
            SelecUnidMoneForm form = new SelecUnidMoneForm();
            List listCuentas = new ArrayList();
            form.setCliente((String)request.getSession(false).getAttribute("cliente"));
            //form.setListCodClientes((String)request.getSession(false).getAttribute("listClie"));
            //form.setCodSucuHtb((String)request.getSession(false).getAttribute("sucursal"));            
            
            /*
            * JRA 20/04/2011
            * MODIFICACION PARA QUE SOPORTE MULTIPLES SUCURSALES
            * *//*
            String[] sucursales=(String[])request.getSession(false).getAttribute("chksSucu");
            if (sucursales!=null && sucursales.length>0){
                String listCodSucu=Util.arrayToString(sucursales,",");
                form.setCodSucuHtb(listCodSucu);  
            }
            else{
                form.setCodSucuHtb((String)request.getSession(false).getAttribute("sucursal"));
            }*/
            /*FIN MODIFICACION JRA*/
            
            /*
            String[] chksCuenta = (String[])request.getSession(false).getAttribute("chksCuenta");
            String cuenta = request.getParameter("cuenta");
            if("0".equals(cuenta)){
                //query nuevo
                //listCuentas = servicioHermetic.getCuentas(form.getCodSucuHtb(),form.getCliente());
                listCuentas = servicioHermetic.getListClieByCta(form.getCliente(),form.getCodSucuHtb(),"");
                chksCuenta = Util.listToStringArrayMultiSucuCta(listCuentas);
                request.getSession(false).setAttribute("chksCuenta",chksCuenta);
            }*/
            
            /**JRA-12/07/2011- Agregado para cuentas Principales*/
            
            String[] chksModulo = (String[])request.getSession(false).getAttribute("chksModulo");
            String tipoUnidMoneSession =  (String)request.getSession(false).getAttribute("tipoUnidMone");        
            String tipoUnidMone = request.getParameter("tipoUnidMone");
            request.getSession(false).setAttribute("tipoUnidMone",tipoUnidMone);
          
          String cuenta = request.getParameter("cuenta");  
          String v_cliente=request.getParameter("cliente");
          String v_sucursal=request.getParameter("sucursal");
          String codSucursal = (String)request.getSession(false).getAttribute("sucursal");
          String listCodSucurs="";
          String listCodClies="";
          String listCodCtaCadena="";
          
          if(cuenta.equals("0")){
            if(v_cliente != null && v_cliente.equals("1"))
            {
              String[] codClies=(String[])request.getSession(false).getAttribute("chksClieCorp");
              if(codClies!=null)
              for(int i=0;i<codClies.length;i++){
                  if(codClies[i]!=null){
                    if(i==0)
                        listCodClies=codClies[i];
                    else
                        listCodClies=listCodClies+","+codClies[i];
                  }
              }
            }
            else{
             listCodClies=(String)request.getSession(false).getAttribute("listClie");
            }
            
            if(codSucursal.equals(COD_SUCU_PRINCIPAL)){
                  if(v_sucursal!=null && v_sucursal.equals("1"))
                  {
                    String[] codSucurs=(String[])request.getSession(false).getAttribute("chksSucu");
                    if(codSucurs!=null)
                    for(int i=0;i<codSucurs.length;i++)
                    {
                      if(codSucurs[i]!=null){
                        if(i==0)
                            listCodSucurs=codSucurs[i];
                        else
                            listCodSucurs=listCodSucurs+","+codSucurs[i];
                      }
                    }
                  }
                  else if (v_sucursal!=null) {
                    listCodSucurs="";
                  }
                  else{
                    listCodSucurs=(String)request.getSession(false).getAttribute("sucursal");
                  }
                    
            }
            else{
              listCodSucurs=codSucursal;
            }
          }
          else{
            listCodSucurs = "";
            listCodClies="";
            listCodCtaCadena="";
            String[] chksCuentasIS =(String[])request.getSession(false).getAttribute("chksCuentasIS");
            if(chksCuentasIS!=null)
                for(int i=0;i<chksCuentasIS.length;i++){
                  //CuentaBean cuentaBean=new CuentaBean();
                  //cuentaBean.getCtaSucuClie()
                    if(chksCuentasIS[i]!=null){
                      String[]cods = chksCuentasIS[i].split("-");
                      if(listCodCtaCadena.equals(""))listCodCtaCadena=chksCuentasIS[i];
                      else listCodCtaCadena = listCodCtaCadena+","+chksCuentasIS[i];
                      if(listCodSucurs.equals(""))listCodSucurs=cods[1];
                      else listCodSucurs = listCodSucurs+","+cods[1];
                      if(listCodClies.equals(""))listCodClies=cods[2];
                      else listCodClies = listCodClies+","+cods[2];
                    }
               }
          }
            
            
            //Obtengo la lista de modulos por codigo de cuenta seleccionado
            List listModulos = new ArrayList();
            /*String arrayCuentas = null;
            if(chksCuenta!=null)
            arrayCuentas=Util.arrayToString(chksCuenta,",");*/
            
            //if (arrayCuentas!=null && arrayCuentas.length() >0 ){
            logger.info("codigos de sucursales = "+listCodSucurs);
            logger.info("codigos de clientes = "+listCodClies);
            logger.info("codigos de cadena = "+listCodCtaCadena);
            logger.info("codigos de um = "+tipoUnidMone);
            listModulos = servicioHermetic.getListBoveMultiSucu(listCodSucurs, listCodClies, listCodCtaCadena, tipoUnidMone);
            //}
            
            //Obtengo y selecciono los modulos solo la primera vez que se seleciona un tipo de unidad moentaria
            if (tipoUnidMone!=null && !tipoUnidMone.equals(tipoUnidMoneSession)){     
                //Por defecto esta marcado TODOS las bovedas            
                chksModulo = Util.listToStringArrayBoveMultiSucu(listModulos);     
                request.getSession(false).setAttribute("chksModulo",chksModulo);             
            }        
            
            //asigno los valores de las cuentas seleccionadas en session        
            listModulos = Util.setChksSessionBoveMultiSucu(chksModulo, listModulos);                
            form.setListModulos(listModulos);            
            request.getSession(false).setAttribute("listModulos",listModulos);
            
            model.put("listModulos",listModulos);
            model.put(FORM_KEY,form);
            return FORM_SELECT_UNID_MONE_MULTI_SUCU;
        }
        catch (Exception e) {
            e.printStackTrace();
            return FORM_ERROR_POPUP_VIEW;
        }
    }
    @RequestMapping(params={"accion=buscarModulo","desModulo"}) 
    protected String buscarModulo(@RequestParam("desModulo") String desModulo ,ModelMap model,@ModelAttribute(FORM_KEY) SelecUnidMoneForm form,HttpServletRequest request)throws Exception{
        try {
            logger.info(this.getClass().toString()+" "+"metodo: GET");
            
            /*Estos datos ya deben haber sido obtenidos en el metodo showForm*/
            //SelecUnidMoneForm form = new SelecUnidMoneForm();
            form.setCliente((String)request.getSession(false).getAttribute("cliente"));           
            //form.setCodSucuHtb((String)request.getSession(false).getAttribute("sucursal"));        
            String[] chksSucu = (String[])request.getSession(false).getAttribute("chksSucu");
            String listCodSucu=Util.arrayToString(chksSucu,",");
            form.setCodSucuHtb(listCodSucu);  
            
            String[] chksCuenta = (String[])request.getSession(false).getAttribute("chksCuenta");        
            String[] chksModulo = (String[])request.getSession(false).getAttribute("chksModulo");
            form.setTipoUnidMone((String)request.getSession(false).getAttribute("tipoUnidMone"));        
            List listModulos = new ArrayList();        
    
            //Obtener la lista de codigos de Cuenta
            String arrayCuentas = Util.arrayToString(chksCuenta,",");
            if (arrayCuentas!=null && arrayCuentas.length() >0 ){            
                 listModulos = servicioHermetic.getDescListBoveMultiSucu(form.getCliente(),form.getCodSucuHtb(), arrayCuentas, form.getTipoUnidMone(),desModulo);
                 listModulos = Util.setChksSessionBoveMultiSucu(chksModulo, listModulos);  
            }           
            form.setListModulos(listModulos);
            if(desModulo.equals(""))
                request.getSession(false).setAttribute("listModulos",listModulos);

            model.put("listModulos",listModulos);
            model.put(FORM_KEY,form);
            return FORM_SELECT_UNID_MONE_MULTI_SUCU;
        }
        catch (Exception e) {
            return FORM_ERROR_POPUP_VIEW;
        }
    }
    
    @RequestMapping(params={"accion=searchDesMod"}) 
    protected @ResponseBody String[] searchDesMod(HttpServletRequest request)throws Exception{        
        logger.info(this.getClass().toString()+" "+"metodo: searchDesMod");        
        List listModulos = (List)request.getSession(false).getAttribute("listModulos");
        String[] arrayModulos = new String[listModulos.size()];
        for(int i=0;i<listModulos.size();i++){
            arrayModulos[i] = ((CuentaBean)listModulos.get(i)).getDescripcion();
        }
        return arrayModulos;
    }
    @RequestMapping(params={"accion=selectCodModulo","codMat"}) 
    protected @ResponseBody String[] selectCodModulo(@RequestParam("codMat") String codMat,@ModelAttribute(FORM_KEY) SelecUnidMoneForm form,HttpServletRequest request)throws Exception{        
        logger.info(this.getClass().toString()+" "+"metodo: selectCodMat");        
        String[] chksModulo = (String[])request.getSession(false).getAttribute("chksModulo");
        if(("").equals(codMat))
            return chksModulo; 
        if(chksModulo!=null)
            for(int i=0;i<chksModulo.length;i++){                
                if(chksModulo[i]!=null&&chksModulo[i].equals(codMat)){
                    break;
                }
                if(chksModulo[i]==null){
                    chksModulo[i] = codMat;
                    break;
                }
            }            
        else{
            chksModulo= new String[1000];
            chksModulo[0]=codMat;
        }        
        request.getSession(false).setAttribute("chksModulo",chksModulo);        
        return chksModulo;
    }
    
    @RequestMapping(params={"accion=deselectCodCuenta","codMat"}) 
    protected @ResponseBody String[] deselectCodCuenta(@RequestParam("codMat") String codMat,@ModelAttribute(FORM_KEY) SelecUnidMoneForm form,HttpServletRequest request)throws Exception{        
        logger.info(this.getClass().toString()+" "+"metodo: deselectCodCuenta");        
        String[] chksModulo = (String[])request.getSession(false).getAttribute("chksModulo");

        if(chksModulo!=null && chksModulo.length > 0)
            for(int i=0;i<chksModulo.length;i++){                
                if(chksModulo[i]!=null && chksModulo[i].equals(codMat)){
                    chksModulo[i] = null;
                    break;
                }
            }            
        
        request.getSession(false).setAttribute("chksModulo",chksModulo);        
        return chksModulo;
    }      
    
    @RequestMapping(params={"accion=seleccionarModulos"})
    protected void seleccionarModulos(ModelMap model,@ModelAttribute(FORM_KEY) SelecUnidMoneForm form,HttpServletRequest request)throws Exception{
        logger.info("seleccionarModulos");
        String[] _chk = request.getParameterValues("_chk");
        request.getSession(false).setAttribute("_chk",_chk);
    }  

    @RequestMapping(params={"accion=selectTodos","codTodos"}) 
    protected String selectTodos(@RequestParam("codTodos") boolean codTodos ,ModelMap model,HttpServletRequest request)throws Exception{
        logger.info(this.getClass().toString()+" "+"metodo: GET");
        //SelecUnidMoneForm form = (SelecUnidMoneForm)model.get("form");//new SelecCuentaForm();
        SelecUnidMoneForm form=new SelecUnidMoneForm();
        //Asigno el check a todos los elenmentos de la lista Cuenta        
        List listModulos=(List) request.getSession(false).getAttribute("listModulos");
        //List listModulos = form.getListModulos(); 
        listModulos = Util.setChksTodos(codTodos, listModulos);        
        form.setListModulos(listModulos);
        
        //Subo a session los todos los Checks Cuenta
        if (codTodos) {
            String[] chksModulo = Util.listToStringArrayBoveMultiSucu(listModulos);
            request.getSession(false).setAttribute("chksModulo",chksModulo);       
        }else {
            request.getSession(false).setAttribute("chksModulo",null);        
        }
        
        request.getSession(false).setAttribute("listModulos",listModulos);
        model.put("listModulos",listModulos);
        model.put(FORM_KEY,form);
        return FORM_SELECT_UNID_MONE_MULTI_SUCU;
    }
    @RequestMapping(params={"accion=verifyTipUnidMone"}) 
    protected @ResponseBody boolean verifyTipUnidMone(HttpServletRequest request)throws Exception{        
        logger.info(this.getClass().toString()+" "+"metodo: verifyTipUnidMone");
        String[] chksModulo = (String[])request.getSession(false).getAttribute("chksModulo");
        String tipoUnidMoneSession =  (String)request.getSession(false).getAttribute("tipoUnidMone");
        boolean hasBovedas = false;
        if(Util.contDatosSession(chksModulo)>0||tipoUnidMoneSession==null)
            hasBovedas = true;
        return hasBovedas;
    }
    
    
}
